<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原型的注意事项2</title>
</head>
<body>
<script>

    /**
     * 要区分两种方式的修改
     * 基于原型已有的属性或者方法进行的修改操作才是修改
     * 还有一种重新赋值的操作叫做赋值
     *
     * 子类无法通过赋值(添加属性  this.属性)的方式为父类添加一个新的属性 因为当子类调用时这里的this是子类对象而不是父类对象
     *  如果可以这样的话那么子类调用父类构造器赋值的话还是给父类赋值呢
     *
     * 但是如果子类中修改一个自己没有的属性的话,那么她首先要获得这个属性就得去父类中读取到这个属性再进行修改 这样一来修改的就是父类的属性了
     * 想要避免这个问题的发生最简单的就是将每个子类自己的数据定义在自己的身上
     *
     * */

    function Animal() {
        this.month = 12
    }

    Animal.prototype.eat = function () {
        console.log(`${this} is eat.`)
    }

    function Dog() {

    }

    Dog.prototype = new Animal()
    Dog.prototype.constructor = Dog

    let animal = new Animal()
    let dog = new Dog()
    console.log(dog)
    /*赋值型修改影响的是自身  这里是重写了父类中的函数只会影响子类不会影响父类*/
    // dog.eat = function (){
    //     console.log(111)
    // }
    //这也是赋值型修改 因为JS是动态语言所以这里的意思是动态赋值
    //赋值型修改就是将.后面的属性全部替换掉
    dog.month = 200
    console.log(dog.month)
    console.log(animal.month)

    dog.eat.a = 100
    console.log(dog.eat.a)
    console.log(animal.eat.a)


</script>
</body>
</html>